def get_max_withdraw(indexs):
    """
    计算投资序列的最大回撤（Maximum Drawdown）

    最大回撤：从最高点到最低点的最大跌幅，衡量投资可能面临的最大损失

    参数:
        indexs: 数字列表，代表基金净值或价格序列

    返回:
        (最大回撤百分比, 峰值位置索引, 谷值位置索引)
    """
    # 初始化变量
    max_withdraw = 0          # 当前找到的最大回撤值（小数形式）
    peak_index = 0            # 最大回撤对应的峰值位置（索引）
    valley_index = 0          # 最大回撤对应的谷值位置（索引）
    last_high = indexs[0]     # 记录到目前为止的最高点，初始为第一个值
    last_high_index = 0       # 记录最高点出现的位置

    # 遍历整个数据序列
    for index, current in enumerate(indexs):
        # 如果当前值超过了之前的最高点，更新最高点
        if current > last_high:
            last_high = current
            last_high_index = index
        else:
            # 计算从最高点到当前点的回撤幅度
            # 回撤 = (最高点 - 当前点) / 最高点
            current_withdraw = (last_high - current) / last_high

            # 如果当前回撤比之前记录的最大回撤还要大，更新最大回撤
            if current_withdraw > max_withdraw:
                max_withdraw = current_withdraw
                peak_index = last_high_index    # 记录峰值位置
                valley_index = index            # 记录谷值位置

    # 返回结果：将小数形式的回撤转换为百分比，并返回峰值和谷值位置
    return max_withdraw * 100, peak_index, valley_index


# 简单示例
if __name__ == "__main__":
    # 示例数据：模拟基金净值走势
    # 从1.0涨到1.5（上涨50%），然后跌到0.9（下跌40%）
    # data = [1.0, 1.2, 1.5, 1.3, 1.1, 0.9, 1.0]
    # data = [1.0, 1.2, 1.5, 1.3, 1.1, 0.9, 1.0,1.6,1.7,1.8]
    data = [4.4559,4.5364,4.5623,4.6649,4.7106]

    print("基金净值数据:", data)
    print("数据说明：从1.0涨到1.5，然后跌至0.9，最大回撤发生在0.9处")
    print()

    # 计算最大回撤
    max_withdraw, peak_idx, valley_idx = get_max_withdraw(data)

    # 输出结果
    print(f"最大回撤: {max_withdraw:.2f}%")
    print(f"峰值位置: 第{peak_idx}个数据点，净值: {data[peak_idx]}")
    print(f"谷值位置: 第{valley_idx}个数据点，净值: {data[valley_idx]}")

